#include <iostream>
#include <pthread.h>
#include <string>
#include <cstdio>
#include <unistd.h>
using namespace std;

const int num=5;//创建5个线程

pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void *active(void *args)
{
    string name = static_cast<const char*>(args);
    while(true)
    {
        pthread_mutex_lock(&mutex);
        pthread_cond_wait(&cond,&mutex);//加锁和解锁之间去等待,调用的时候，会自动释放锁
        cout<<name<<" 活动"<<endl;
        pthread_mutex_unlock(&mutex);
    }
    
    
}
int main()
{
    pthread_t tids[num];
    for(int i=0;i<num;i++)
    {
        char *name = new char[32];
        snprintf(name ,32 , "thread--%d",i+1);
        pthread_create(tids+i,nullptr,active,name);
    }

    sleep(3);//想让所以新线程去等待，3秒后让主线程去定向的唤醒一个线程，也可以让用户按顺序去唤醒

    while(true)
    {
        cout<<" main thread wakeup thread... "<<endl;
        //pthread_cond_signal(&cond);
        pthread_cond_broadcast(&cond);//5个线程同时唤醒
        sleep(1);//每隔一秒去唤醒一个线程
    }

    for(int i=0;i<num;i++)
    {
        pthread_join(tids[i],nullptr);
    }
    return 0;
}






















//模拟一个线程只加锁，一个线程只解锁，说明加锁和解锁并不是必须在一个线程里进行
//锁并不是只可以对临界资源的保护，还可以应用锁来控制另一个线程的行为
// pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

// void *threadRoutine(void *args)
// {
//     cout << "I am a new thread" << endl;

//     pthread_mutex_lock(&mutex);
//     cout << "I got a mutex " << endl;

//     pthread_mutex_lock(&mutex); // 申请锁的问题，它会停下来
//     cout << "I alive again " << endl;
//     return nullptr;
// }
// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRoutine, nullptr);

//     sleep(3);
//     cout << "main thread run begin" << endl;
//     pthread_mutex_unlock(&mutex);
//     cout << "main thread unlock..." << endl;
//     return 0;
// }